iT邦幫忙

2022 iThome 鐵人賽

DAY 2
0
自我挑戰組

基於自然語言處理的新聞意見提取應用開發筆記系列 第 2

[Day-02] 專案的 Python 環境設置(如何使用 Pipenv)

  • 分享至 

  • xImage
  •  

Day-02 內容

  • 此文章的測試環境
  • 專案的 Python 環境建立
    • 選擇 Python 的特定版本
    • 在 macOS Monterey 中安裝 Python 3.9
    • pipenv
      • 為什麼需要虛擬環境 (virtual environment)
      • Pipenv 的特點
      • 安裝 pipenv
      • 使用 Pipenv 建立 Python 3.9 虛擬環境
      • 在 Pipenv 建立的虛擬環境中安裝所需套件
      • 使用已建立的 Pipfile 和 Pipfile.lock 建立的虛擬環境並安裝所需套件
      • 將 Pipfile.lock 中所記錄的套件與版本輸出成 requirements.txt
      • 在 Pipenv 建立的虛擬環境中執行 Python
      • (補充)其他 Pipenv 指令

此文章的測試環境

我這次主要使用我的蘋果筆電來開發「自然語言處理的新聞意見提取應用」,本篇文章中的安裝及操作皆在此電腦環境下測試,簡略規格如下:

  • OS: macOS Monterey 12.5
  • CPU: Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz

專案的 Python 環境建立

過去我在與同學一同撰寫 Python 專案時,發生過程式碼在其他人的電腦上無法正常運作尷尬情況,就很可能是因為有人沒留意下面事項所導致的:

  • Python 版本是否相同?
  • 安裝的 Python 套件版本是否相同?

如果你有類似的經驗,也許可以讀一下這篇文章分享。

相比於後續比對 Python 及套件的版本,從專案一開始就使用合適的工具來管理虛擬環境會來的更為省力,所以我選擇將這部分放在剛開始的 Day2 中分享。


選擇 Python 的特定版本

在我撰寫文章的當下,在 https://www.python.org/downloads/ 頁面中顯示幾個可下載的主要 Python 版本如下:

Python version Maintenance status First released End of support Release schedule
3.10 bugfix 2021-10-04 2026-10 PEP 619
3.9 security 2020-10-05 2025-10 PEP 596
3.8 security 2019-10-14 2024-10 PEP 569
3.7 security 2018-06-27 2023-06-27 PEP 537

上表中比較需要注意的資訊有 Maintenance status 與 End of support 。

不同的 Python 版本可能有部分語法會不同、Standard Library 中的套件不同的情況,在選擇時也需要考量到後續你想安裝的套件是否支援此版本的 Python。

從上表中 3.9 與 3.8 是現階段常見的 Python 版本,考量到此專案後續會用到的 AWS(Amazon Web Services)服務中的 Lambda ,其現階段所支援最新的 Python 版本為 3.9,所以我決定在自己電腦建構 Python 3.9 環境,方便後續測試程式運行。

macos-12_3-release-notes 有提到原先的 Python 2.7 將被移除,考量到你的電腦可能沒有安裝想要使用的 Python 版本(在此篇文章中為 Python 3.9),接下來會介紹其中一種 Python 3.9 的安裝方法。

Python

Deprecations

Python 2.7 was removed from macOS in this update. Developers should use Python 3 or an alternative language instead. (39795874)


在 macOS Monterey 中安裝 Python 3.9

請注意 macOS Monterey 以外的作業系統可能不適用下面的安裝過程!

首先執行以下指令,先檢查 mac 已經安裝了哪些版本的 Python。

ls /usr/local/opt/

如果有出現 python@3.9 代表已經安裝 Python 3.9 ,如果沒有出現則可以透過下列步驟安裝:

  1. 安裝 Homebrew (安裝方法請參考 https://brew.sh/,如先前已安裝則跳過)
  2. 運行下面指令,用 Homebrew 安裝 Python 3.9:
    (細節請參考 https://formulae.brew.sh/formula/python@3.9,文章撰寫時此指令會安裝 Python 3.9.14)
    brew install python@3.9
    

Pipenv

為什麼需要虛擬環境 (virtual environment)

在 Python 3.9.14 文檔中的 12. 虛擬環境與套件 中有提到:

Python 應用程式通常會用到不在標準函式庫的套件和模組。應用程式有時候會需要某個特定版本的函式庫,因為這個應用程式可能需要某個特殊的臭蟲修正,或是這個應用程式是根據該函式庫特定版本的介面所撰寫。
這意味著不太可能安裝一套 Python 就可以滿足所有應用程式的要求。如果應用程式 A 需要一個特定的模組的 1.0 版,但另外一個應用程式 B 需要 2.0 版,那麼這整個需求不管安裝 1.0 或是 2.0 都會衝突,以致於應用程式無法使用。
解決方案是創建一個虛擬環境 (virtual environment),這是一個獨立的資料夾,並且裡面裝好了特定版本的 Python,以及一系列相關的套件。
不同的應用程式可以使用不同的虛擬環境。以前述中需要被解決的例子中,應用程式 A 能夠擁有它自己的虛擬環境,並且是裝好 1.0 版,然而應用程式 B 則可以是用另外一個有 2.0 版的虛擬環境。要是應用程式 B 需要某個函式庫被升級到 3.0 版,這並不會影響到應用程式 A 的環境。


Pipenv 的特點

雖然 Python 3.9 在 Standard Library 中有個名為 venv 的虛擬環境管理工具,不過因為 Pipenv 在使用上的方便特性,讓我決定使用 Pipenv 取代 venv,用來管理本次專案的虛擬環境。下面是從 https://pipenv.pypa.io/en/latest/ 擷取出來的介紹:

The problems that Pipenv seeks to solve are multi-faceted:

  • You no longer need to use pip and virtualenv separately. They work together.
  • Managing a requirements.txt file can be problematic, so Pipenv uses Pipfile and Pipfile.lock to separate abstract dependency declarations from the last tested combination.
  • Hashes are used everywhere, always. Security. Automatically expose security vulnerabilities.
  • Strongly encourage the use of the latest versions of dependencies to minimize security risks arising from outdated components.
  • Give you insight into your dependency graph (e.g. $ pipenv graph).
  • Streamline development workflow by loading .env files.

安裝 pipenv

詳細安裝可參考 https://pipenv.pypa.io/en/latest/install/#installing-pipenv

方法ㄧ(已經安裝 Python 與 pip)

執行下面的指令,會將 pipenv 安裝至 home directory。

pip install --user pipenv

方法二(已經安裝 Homebrew)

https://pipenv.pypa.io/en/latest/ 中有指出不推薦此方法,說明如下:

It’s possible to install Pipenv with Homebrew on MacOS, or with Linuxbrew on Linux systems. However, this is now discouraged, because updates to the brewed Python distribution will break Pipenv, and perhaps all virtual environments managed by it. You’ll then need to re-install Pipenv at least.

brew install pipenv

使用 Pipenv 建立 Python 3.9 虛擬環境

以下步驟使用 Pipenv 建立 Python 3.9 環境:

  1. 執行以下指令建立空的專案資料夾(YOUR_PROJECT_NAME 可自行定義):
mkdir YOUR_PROJECT_NAME
cd YOUR_PROJECY_NAME
  1. 執行以下指令會建立 Python 3.9 的虛擬環境:
pipenv install --python /usr/local/opt/python@3.9/bin/python3

當中 /usr/local/opt/python@3.9/bin/python3 為上一步 Python 3.9 安裝時建立的路徑。

注意: 要使用上述指令來選擇虛擬環境的 Python 版本,而不是一般教學中使用的 pipenv --three

  1. 可以看到有個名為 Pipfile 的檔案出現在專案資料夾中(/YOUR_PROJECT_NAME/),內容如下所示:
    (可以看到指定 python_version = "3.9"
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]

[dev-packages]

[requires]
python_version = "3.9"

移除 Pipenv 建立的虛擬環境

在與 Pipfile 同一層的路徑下執行下面指令 pipenv --rm 來移除虛擬環境:


在 Pipenv 建立的虛擬環境中安裝所需套件

注意:下面 pipenv 開頭的指令需要在與 Pipfile 同一層的路徑下執行。

在撰寫 python 程式,時常會需要 import 一些會用到的相關套件,而這些套件很常需要透過 pip install 套件名稱 指令進行安裝,而在 Pippenv 建立的虛擬環境中則使用 pipenv install 套件名稱 將所需套件安裝到 Pippenv 建立的虛擬環境中。在安裝第一個套件後專案資料夾中會產生一個名為 Pipfile.lock 的檔案。

下面提供三個例子:

  1. 假設專案程式碼在「正常執行時」會需要用到套件 beautifulsoup4

    • 安裝指令改成 pipenv install beautifulsoup4(pip install beautifulsoup4)
    • 執行完後在 Pipfile 中可以看到 beautifulsoup4 出現在 [packages] 的類別下面。
  2. 假設專案程式碼在「開發」時會需要用到套件 yapf(Python 程式碼風格工具):

    • 安裝指令改成 pipenv install yapf --dev(pip install yapf)
    • 可以用 [packages] 和 [dev-packages] 來區分執行或開發所需要用到的套件,後續如果在其他只需要程式能執行的場景下,就可以只安裝 [packages] 類別下列出的套件。
    • 執行完後在 Pipfile 中可以看到 yapf 出現在 [dev-packages] 的類別下面。
  3. 假設需要安裝 requirements.txt 中所記錄的所有套件

    • 執行 pipenv install --requirements requirements.txt
    • 可在上面指令最後面加上 --dev 安裝至 [dev-packages] 類別,否則預設加在 [packages] 的類別下。

移除安裝在 Pipenv 建立的虛擬環境中的套件

  • 要移除的套件列在 Pipfile 中的 [packages] 類別下時,使用 pipenv uninstall 套件名稱
  • 要移除的套件列在 Pipfile 中的 [dev-packages] 類別下時,使用 pipenv uninstall 套件名稱 --dev
  • 移除所有在 Pipfile 中的 [packages] 類別下的套件時,使用 pipenv uninstall --all
  • 移除所有在 Pipfile 中的 [dev-packages] 類別下的套件時,使用 pipenv uninstall --all-dev

使用已建立的 Pipfile 和 Pipfile.lock 建立的虛擬環境並安裝所需套件

注意:下面 pipenv 開頭的指令需要在與 Pipfile 同一層的路徑下執行。

假設你目前的專案是從別人的 github 上 clone 下來的,資料夾中只包含了 Pipfile 或是包含 Pipfile 和 Pipfile.lock,可依以下方式安裝所需套件:

  • 只包含了 Pipfile:

    • 在與 Pipfile 同一層的路徑下執行 pipenv install --python /usr/local/opt/python@3.9/bin/python3 安裝 Pipfile 內所有套件
    • /usr/local/opt/python@3.9/bin/python3 為 Python 3.9 的路徑
  • 包含 Pipfile 和 Pipfile.lock:

    • 在與 Pipfile 和 Pipfile.lock 同一層的路徑下執行 pipenv sync --python /usr/local/opt/python@3.9/bin/python3 安裝所有在pipfile.lock中的套件
    • /usr/local/opt/python@3.9/bin/python3 為 Python 3.9 的路徑

將 Pipfile.lock 中所記錄的套件與版本輸出成 requirements.txt

執行指令 pipenv requirements > requirements.txt ,可將 Pipfile.lock 中所記錄的套件與版本輸出成 requirements.txt,requirements.txt 會包含套件「詳細版本」,例如:beautifulsoup4==4.11.1


在 Pipenv 建立的虛擬環境中執行 Python

注意:下面 pipenv 開頭的指令需要在與 Pipfile 同一層的路徑下執行。

有以下兩中方法可以在Pipenv 建立的虛擬環境中執行 Python:

方法一

假設要在虛擬環境下執行一個名為 mian.py 的 Python 檔案,在與 Pipfile 同一層的路徑下執行 pipenv run python main.py,當中的 python main.py 與一般 Python 執行指令相同,以可以替換成其他想要在虛擬環境下執行的指令,例如 pip freezepipenv run pip freeze)。

方法二(我比較常用)

首先執行 pipenv shell 會激活(active)Pipenv 建立的虛擬環境,後續在同一個終端視窗中所執行的指令,例如 python main.py 都會是在此虛擬環境下執行。若是執行 python --version 可確認當下用來執行的 Python 版本。

執行 exit 可以退出已在端視窗中激活(active)的虛擬環境。

使用 .env 中的環境變數

  • 在 Pipfile 同一層的路徑下新增名為 .env 的檔案,並且在 .env 當中定義環境變數。之後再執行上面提到的方法一、二時,Pipenv 會自動載入 .env 中的環境變數到執行環境。
  • 執行 pipenv --envs 可以輸出環境變數方便查看。

(補充)其他 Pipenv 指令

其他 Pipenv 指令用法可參考 Pipenv指令大全 或是官方文檔 Pipenv: Python Dev Workflow for Humans


上一篇
[Day-01] 關於「基於自然語言處理的新聞意見提取應用開發」
下一篇
[Day-03] 專案的 git branch 工作流程與 git commit message 格式(使用 Git Flow)
系列文
基於自然語言處理的新聞意見提取應用開發筆記17
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言